package reversi.db;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class MenejadorDb {
	
	//Inserta a un usuario en la BD
	public void InsertDb(Connection conPostgres,String nombre, String contraseña )
			throws SQLException {
		String sqlInsert = "insert into usuarios (usuario,contraseña,conectado,ocupado) values(?,?,?,?)";
		PreparedStatement pstmt = conPostgres.prepareStatement(sqlInsert);
		pstmt.setString(1, nombre);
		pstmt.setString(2, contraseña);
		pstmt.setString(3, "si");
		pstmt.setString(4, "no");
		pstmt.executeUpdate();
	}
	//Borra a un usuario de la BD
	public void deleteDb(Connection conPostgres, String nombre)
			throws SQLException {
		Statement stmt = conPostgres.createStatement();

		// Step 3 & 4: execute a SQL UPDATE statement via executeUpdate()
		// which returns an int indicating the number of row affected.
		String sqlDelete = "delete from usuarios where usuario = '"+nombre+"'";
		//System.out.println("El SQL es: " + sqlDelete); // For debugging
		//int count = stmt.executeUpdate(sqlDelete);
		stmt.executeUpdate(sqlDelete);
		//System.out.println(count + " registros modificados");
	}
	//Realiza una consulta, sobre los usuarios conectados y los ocupados
	public String SelectDb(Connection conPostgres)
			throws SQLException {
		String consulta ="Libres: \n";
		Statement sentencia = conPostgres.createStatement();
	
		ResultSet rs = sentencia
				.executeQuery("select * from usuarios where conectado = 'si' and ocupado = 'no'");

		while (rs.next()) {
			/*System.out.println("Usuario " + rs.getString("usuario"));
			System.out.println("Ocupado " + rs.getString("ocupado"));
			System.out.println("--- --- ---");*/
			consulta = consulta + rs.getString("usuario") + "\n";
		}
		
		consulta = consulta + "--- --- --- \n Jugando: \n";
		rs = sentencia
				.executeQuery("select * from usuarios where conectado = 'si' and ocupado = 'si'");

		while (rs.next()) {
			/*System.out.println("Usuario " + rs.getString("usuario"));
			System.out.println("Ocupado " + rs.getString("ocupado"));
			System.out.println("--- --- ---");*/
			consulta = consulta + rs.getString("usuario") + "\n";
		}
		
		return consulta;
	
	}
	//Actualiza a conectado la columna de conectado de la tabla usuarios
	public void updateConectadoDb(Connection conPostgres, String usuario)
			throws SQLException {
		Statement stmt = conPostgres.createStatement();

		// Step 3 & 4: execute a SQL UPDATE statement via executeUpdate()
		// which returns an int indicating the number of row affected.
		String sqlStr = "update usuarios set conectado = 'si' where usuario = '"+usuario+"'";
		//System.out.println("El SQL es: " + sqlStr); // For debugging
		//int count = stmt.executeUpdate(sqlStr);
		stmt.executeUpdate(sqlStr);
		//System.out.println(count + " registros actualizado");
	}
	//Actualiza a desconectado la columna de conectado de la tabla usuarios
	public void updateDesconectadoDb(Connection conPostgres, String usuario)
			throws SQLException {
		Statement stmt = conPostgres.createStatement();

		// Step 3 & 4: execute a SQL UPDATE statement via executeUpdate()
		// which returns an int indicating the number of row affected.
		String sqlStr = "update usuarios set conectado = 'no' where usuario = '"+usuario+"'";
		//System.out.println("El SQL es: " + sqlStr); // For debugging
		//int count = stmt.executeUpdate(sqlStr);
		stmt.executeUpdate(sqlStr);
		//System.out.println(count + " registros actualizados");
	}
	//Actualido el estado de ocupado del usuario
	public void updateOcupadoDb(Connection conPostgres, String usuario, String estado)
			throws SQLException {
		Statement stmt = conPostgres.createStatement();

		// Step 3 & 4: execute a SQL UPDATE statement via executeUpdate()
		// which returns an int indicating the number of row affected.
		String sqlStr = "update usuarios set ocupado = '"+estado+"' where usuario = '"+usuario+"'";
		//System.out.println("El SQL es: " + sqlStr); // For debugging
		//int count = stmt.executeUpdate(sqlStr);
		stmt.executeUpdate(sqlStr);
		//System.out.println(count + " registros actualizados");
	}
	//Para controlar si coinciden el nombre de usuario y contraseña
	public boolean existeDb(Connection conPostgres, String usuario, String contraseña)  throws IOException
    {
        try
        {
        	Statement sentencia = conPostgres.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                    ResultSet.CONCUR_READ_ONLY );
        	
        	ResultSet rs = sentencia.executeQuery ("SELECT * FROM usuarios WHERE usuario='"+usuario+"' AND contraseña='"+ contraseña+"'");
 
            if( rs.first() )        // si es valido el primer reg. hay una fila, entonces el usuario y su contraseña existen
                return true;        //usuario validado correctamente
            else
                return false;        //usuario validado incorrectamente
                 
        } catch (Exception e)
        {
            e.printStackTrace();
            return false;
        }
 
    }
	//Para controlar si existe el usuario, cuando se desea registrarse
	public boolean existeDb(Connection conPostgres, String usuario)  throws IOException
    {
        try
        {
        	Statement sentencia = conPostgres.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                    ResultSet.CONCUR_READ_ONLY );
        	
        	ResultSet rs = sentencia.executeQuery ("SELECT * FROM usuarios WHERE usuario='"+usuario+"'");
 
            if( rs.first() )        // si es valido el primer reg. hay una fila, entonces el existe
                return true;        
            else
                return false;       
                 
        } catch (Exception e)
        {
            e.printStackTrace();
            return false;
        }
 
    }
}
